from django.http import JsonResponse
from django.shortcuts import render
from django.views import View
from django.core.cache import cache

from apps.areas.models import Area
from utils.response_code import RETCODE


class AreasView(View):
    def get(self, request):
        # 获取前端传递的参数
        area_id = request.GET.get("area_id")

        # 判断用户想要的是什么,如果为none则是省份
        if not area_id:
            print("缓存不存在")
            # 在redis数据库中查找该数据
            provinces_list = cache.get("provinces_list")

            # 如果缓存不存在,则写入查询数据库并写入缓存
            if not provinces_list:
                # 查询所有的省份名称
                try:
                    # 查询外检是空的情况
                    provinces = Area.objects.filter(parent__isnull=True)

                    # 组成数据,返回给前端
                    provinces_list = []
                    for pro in provinces:
                        provinces_list.append({"id": pro.id, "name": pro.name})
                except Exception as e:
                    return JsonResponse({'code': RETCODE.DBERR, 'errmsg': '获取area_id失败'})

                # 写入缓存
                cache.set("provinces_list", provinces_list, 10*60)
            return JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'province_list': provinces_list})

        # 如果有,就是area_id就是市或者县
        else:
            parent_module = Area.objects.get(id=area_id)

            # 查询缓存,
            subs_list = cache.get("sub" + area_id)

            # 如果缓存中没有数据,则查询数据库,并写入缓存
            if not subs_list:
                # 使用外检,根据上级取出下级
                subs = parent_module.subs.all()

                # 构建前端的数据
                subs_list = []

                for sub in subs:
                    subs_list.append({"id": sub.id, "name": sub.name})

                sub_data = {
                    "id": parent_module.id,
                    "name": parent_module.name,
                    "subs": subs_list
                }

            # 写入缓存
            cache.set("sub" + area_id, sub_data, 10*60)

            # 响应市或区数据
            return JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'sub_data': sub_data})



